import os
from time import sleep

import allure
import pytest

import page
from page.page_daily_task import PageTask
from page.page_jiamingceshi import PageJiamingceshi
from page.page_login import PageLogin
from tool.get_driver import GetDriver
from tool.get_log import GetLogger

log = GetLogger.get_log()
module_name = str(os.path.basename(__file__)).split('.')[0]


@allure.epic("我的页面")
@allure.feature("每日任务测试用例")
class TestTask:

    @classmethod
    def setup_class(cls):
        cls.driver = GetDriver.get_app_driver()
        cls.login = PageLogin(cls.driver)
        cls.jiaming = PageJiamingceshi(cls.driver)
        cls.task = PageTask(cls.driver)
        cls.task.pagetask_remove_cidao_app()
        try:
            cls.login.base_click_element(page.approve)
        except:
            pass
        try:
            cls.login.base_click_element(page.skip_user_desc)
        except:
            pass
        # 需要未做每日任务的账号
        cls.login.pagelogin(os.environ['TASK_USERNAME'], password='123456')
        cls.login.base_click_element(page.wd_tab)

    @classmethod
    def teardown_class(cls):
        GetDriver.quit_app_driver()

    @allure.story("UI测试——已登录红点状态")
    def test01_task_hongdian_login(self):
        log.info("正在判断登录情况下的红点状态")
        try:
            assert self.task.base_find_element(page.wd_tab_hongdian)
            assert self.task.base_find_element(page.wd_daily_task_hongdian)
            log.info('断言成功')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '红点元素未找到')
            raise

    @allure.story("UI测试——金币")
    def test02_task_ui_coin(self):
        self.coin1 = self.task.pagetask_get_my_coins()
        self.task.pagetask_click_daily_task()
        self.coin2 = self.task.pagetask_get_task_coins()
        log.info("正在进行断言，判断金币数量是否一致")
        try:
            assert self.coin1 == self.coin2
            log.info('断言成功')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '金币数量不一致')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()
            sleep(5)

    @pytest.mark.skipif(condition=bool(int(os.environ['SKIP_CIDAO_STATUE'])), reason='评审开关打开，隐藏了大额任务，跳过相关用例')
    @allure.story("UI测试——词道(未完成)")
    def test03_task_unfinish_cidao(self):
        self.task.pagetask_remove_cidao_app()
        self.task.pagetask_click_daily_task()
        log.info('正在断言标题和按钮状态')
        try:
            assert self.task.pagetask_get_cidao_title() == '日语单词必备软件(0/1)'
            assert self.task.pagetask_get_cidao_btn() == '去下载'
            log.info('断言成功')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '词道标题或按钮状态有误')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()

    @pytest.mark.skipif(condition=bool(int(os.environ['SKIP_CIDAO_STATUE'])), reason='评审开关打开，隐藏了大额任务，跳过相关用例')
    @allure.story('完成任务——词道下载安装')
    def test04_task_finish_cidao(self):
        self.coin1 = self.task.pagetask_get_my_coins()
        self.task.pagetask_remove_cidao_app()
        self.task.pagetask_click_daily_task()
        self.task.pagetask_click_cidao_btn()
        if os.environ['RUN_HOST'] == "http://127.0.0.1:4723/wd/hub":
            self.task.pagetask_install_cidao_app()
        else:
            self.task.pagetask_install_cidao_remote()
        self.task.pagetask_return_to_wdpage_keycode()
        self.task.pagetask_click_daily_task()
        self.task.pagetask_return_to_wdpage_keycode()
        self.task.pagetask_click_daily_task()
        #     send key code
        sleep(5)
        self.coin2 = self.task.pagetask_get_task_coins()
        log.info("正在进行完成任务状态的断言")
        try:
            assert self.task.pagetask_get_cidao_title_finished() == '日语单词必备软件(1/1)'
            log.info('断言任务标题成功')
            assert self.task.pagetask_get_cidao_btn_finished() == '打开'
            log.info('断言开关按钮成功')
            assert int(self.coin2) - int(self.coin1) == 100
            log.info('断言成功')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '词道任务完成状态有误')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()

    @allure.story("UI测试——分享app(未完成)")
    def test05_task_unfinish_share_app(self):
        self.task.pagetask_click_daily_task()
        log.info('正在断言标题和按钮状态')
        try:
            assert self.task.pagetask_get_share_app_title() == '分享App给好友(0/1)'
            assert self.task.pagetask_get_share_app_btn() == '去完成'
            log.info('断言成功')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '分享app标题或按钮状态有误')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()

    @allure.story('完成任务——分享app')
    def test06_task_finish_share_app(self):
        self.coin1 = self.task.pagetask_get_my_coins()
        self.task.pagetask_click_daily_task()
        self.task.pagetask_click_share_app_btn()
        self.task.pagetask_click_share_app_to_QQ()
        try:
            self.task.pagetask_click_ask_right()
            self.task.pagetask_click_share_app_btn()
            self.task.pagetask_click_share_app_to_QQ()
        except:
            pass

        sleep(1)
        self.task.pagetask_return_to_wdpage_keycode()
        self.task.pagetask_click_daily_task()
        sleep(2)
        #     send key code

        self.coin2 = self.task.pagetask_get_task_coins()
        log.info("正在进行完成任务状态的断言")
        try:
            assert int(self.coin2) - int(self.coin1) == 10
            assert self.task.pagetask_get_share_app_title() == '分享App给好友(1/1)'
            assert self.task.pagetask_get_share_app_btn() == '已完成'
            log.info('断言成功')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '分享app任务完成状态有误')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()
            sleep(3)

    @allure.story("UI测试——假名测试和分享成绩单(未完成)")
    def test07_task_unfinish_other_two(self):
        self.task.pagetask_click_daily_task()
        log.info('正在断言标题和按钮状态')
        try:
            assert self.task.pagetask_get_other_two_info() == ('完成一次假名测试(0/1)', '去完成',
                                                               "分享测试成绩单(0/1)", '去完成')

            log.info('断言成功')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '假名测试和分享成绩单每日任务标题或按钮状态有误')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()

    # 正式站答题逻辑完成之前，此case暂时设置为测试站用例
    @pytest.mark.skipif(condition=bool(int(os.environ['SKIP_WSY_DEBUG'])), reason='跳过测试站开关打开，跳过测试站用例')
    @allure.story('完成每日任务——假名测试和分享成绩单')
    def test08_task_finish_other_two_debug(self):
        self.coin1 = self.task.pagetask_get_my_coins()
        self.task.pagetask_click_daily_task()
        self.task.pagetask_click_other_two_btn()
        self.jiaming.pagejiamingceshi_click_ceshi()
        # 测试站逻辑
        # while True:
        #     try:
        #         self.jiaming.pagejiamingceshi_get_ans()
        #     except:
        #         pass
        #     if self.jiaming.pagejiamingceshi_if_confirm_exist():
        #         self.jiaming.pagejiamingceshi_click_confirm()
        #     else:
        #         break
        while True:
            try:
                self.jiaming.pagejiamingceshi_click_fixed_answer()
            except:
                pass
            if self.jiaming.pagejiamingceshi_if_confirm_exist():
                self.jiaming.pagejiamingceshi_click_confirm()
                sleep(1)
                if self.jiaming.pagejiamingceshi_if_next_question_exist():
                    self.jiaming.pagejiamingceshi_click_next_question()
            if self.jiaming.pagejiamingceshi_if_question_exist():
                pass
            else:
                break
        self.task.pagetask_click_share_report()
        self.task.pagetask_click_share_report_to_QQ()
        self.task.pagetask_return_to_wdpage_keycode()
        self.task.pagetask_click_daily_task()
        #     send key code *4
        sleep(3)
        self.coin2 = self.task.pagetask_get_task_coins()
        log.info("正在进行完成任务状态的断言")
        try:
            assert int(self.coin2) - int(self.coin1) == 20
            assert self.task.pagetask_get_other_two_info() == ('完成一次假名测试(1/1)', '已完成',
                                                               "分享测试成绩单(1/1)", '已完成')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '假名测试和分享成绩单任务完成状态有误')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()

    # 正式站答题逻辑完成之前，此case暂时设置为测试站用例
    @pytest.mark.skipif(condition=bool(int(os.environ['SKIP_WSY_DEBUG'])), reason='跳过测试站开关打开，跳过测试站用例')
    @allure.story("UI测试——每日任务红点状态（全部完成）")
    def test09_task_hongdian_finish_all_debug(self):
        try:
            assert not self.task.base_if_element_exist(page.wd_daily_task_hongdian)
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '完成每日任务ui红点状态有误')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()

    @allure.story("积分商城跳转")
    def test10_task_go_shop(self):
        self.coin1 = self.task.pagetask_get_my_coins()
        sleep(5)
        self.task.pagetask_click_daily_task()
        self.task.pagetask_go_to_shop()
        try:
            log.info("正在进行断言：是否跳转到商城页")
            assert self.task.pagetask_if_go_shop()
            # log.info("正在进行断言：判断金币数量是否正确")
            # sleep(10)
            # assert self.coin1 in self.task.pagetask_get_shop_coin()
            log.info('断言成功')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '未跳转商城')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()

    @allure.story("UI测试——未登录红点状态")
    def test11_task_hongdian_unlogin(self):
        log.info("正在判断未登录情况下的红点状态")
        self.login.pagelogin_logout()
        try:
            assert self.task.base_find_element(page.wd_tab_hongdian)
            assert self.task.base_find_element(page.wd_daily_task_hongdian)
            log.info('断言成功')
            self.task.base_get_screenshot_as_file(module_name, '断言成功截图')
        except:
            log.error('断言失败')
            self.task.base_get_screenshot_as_file(module_name, '红点元素未找到')
            raise
        finally:
            self.task.pagetask_return_to_wdpage_keycode()
